/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package modelo;

import file.FileHellper_xls_HistoriaClinica;
import gui.PanelHistoriaClinica;
import java.awt.HeadlessException;
import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;
import persistencia.AtiendeDAO;
import persistencia.ColumnNames;
import persistencia.ConsultasDAO;
import persistencia.IngresosDAO;
import persistencia.IntervencionesDAO;
import persistencia.PacientesDAO;
import persistencia.UrgenciasDAO;
import pojos.Atiende;
import pojos.Consultas;
import pojos.Ingresos;
import pojos.Intervenciones;
import pojos.Paciente;
import pojos.Procesoasistencial;
import pojos.Urgencias;



/**
 * Clase gestora del Panel historia Clinica
 * Instancia y actualiza todas las variables y modelos necesarios
 * Buscar un paciente en PacienteDAO segun un codigo/DNI recibido desde la INterfaz gráfica
 * Busca todos los procesos Asistenciales Asociados al paciente en las clases DAO correspondiente
 * @author Ⓒvenegas
 */
public class GestorHistoriaClinica {

    private PanelHistoriaClinica panel;
    
    private FileHellper_xls_HistoriaClinica fxls;
    
    private List <Procesoasistencial> listaProcAsistenciales;
    private List <Atiende> listaAtiende;
    
    //LISTAS DE LOS PROCESOS ASISTENCIALES
    private List <Intervenciones> listaIntervenciones;
    private List <Ingresos> listaIngresos;
    private List <Consultas> listaConsultas;
    private List <Urgencias> listaUrgencias;
    
    //LISTAS DE LOS MODELOS QUE VAMOS A ASOCIAR A LOS JTABLES
    private TableModel_HistClin_Intervenciones tableModel_Intervenciones;
    private TableModel_HistClin_Ingresos tableModel_Ingresos;
    private TableModel_HistClin_Consultas tableModel_Consultas;
    private TableModel_HistClin_Urgencias tableModel_Urgencias;
    
    private boolean pacienteTieneProcesoAsistencialAsociado;
    
    public GestorHistoriaClinica(PanelHistoriaClinica panel) {
        this.panel = panel;
        instanciarListas();
        instanciarTableModels();
        addTableModels();
    }
    
    
    private void instanciarListas(){
        
        listaProcAsistenciales = new LinkedList();
        listaAtiende = new LinkedList();
        listaIntervenciones = new LinkedList();
        listaIngresos = new LinkedList();
        listaConsultas = new LinkedList();
        listaUrgencias = new LinkedList();
    }
    
    
    private void instanciarTableModels(){
        tableModel_Intervenciones = new TableModel_HistClin_Intervenciones(ColumnNames.getColumnName("Intervenciones"));
        tableModel_Ingresos = new TableModel_HistClin_Ingresos(ColumnNames.getColumnName("Ingresos"));
        tableModel_Consultas = new TableModel_HistClin_Consultas(ColumnNames.getColumnName("Consultas"));
        tableModel_Urgencias = new TableModel_HistClin_Urgencias(ColumnNames.getColumnName("Urgencias"));
    }
    
    
    private void addTableModels(){
        panel.jTableHC_Intervenciones.setModel(tableModel_Intervenciones);
        panel.jTableHC_Ingresos.setModel(tableModel_Ingresos);
        panel.jTableHC_Consultas.setModel(tableModel_Consultas);
        panel.jTableHC_Urgencias.setModel(tableModel_Urgencias);
    }
    
    
    public Paciente buscarPaciente(String dni){
        PacientesDAO pDAO = new PacientesDAO();
        return pDAO.getPaciente(dni);
    }
    
    public Paciente buscarPaciente (Integer codPaciente){
        PacientesDAO pDAO = new PacientesDAO();
        return pDAO.getPaciente(codPaciente);
    }
    
    /**
     * Actualiza nuestra lista de Atiene (Con Procesos Asistenciales) y se las
     * pasa a los modelos de las tablas correspondientes
     * @param paciente Paciente del que queremos consultar la historia clinica
     * @return  True Si el paciente pasado como parametro SI tiene algun proceso asistencial asociado
     *          False Si el paciente pasado como parametro NO tiene algun proceso asistencial asociado
     */
    public boolean setlistaProcAsistenciales(Paciente paciente){
        AtiendeDAO atiendeDAO = new AtiendeDAO();
        listaAtiende = atiendeDAO.getList(paciente);
        updateLists();
        updateTableModels();
        return pacienteTieneProcesoAsistencialAsociado;
    }
    
    
    
    public void clearList(){
        listaProcAsistenciales.clear();
        listaAtiende.clear();
        listaIntervenciones.clear();
        listaIngresos.clear();
        listaConsultas.clear();
        listaUrgencias.clear();
        updateTableModels();
    }
    
    /**
     * Actualizamos las listas de Procesos Asistenciales recuperando dichos objetos
     * de las clases DAO correspondiente (Si existen)
     */
    private void updateLists(){
        
        pacienteTieneProcesoAsistencialAsociado = false;
        Intervenciones intervencion;
        Ingresos ingreso;
        Consultas consulta;
        Urgencias urgencia;
        
        for (Atiende atiende : listaAtiende){
            intervencion = IntervencionesDAO.getIntervencion(atiende.getProcesoasistencial());
            if (intervencion != null){
                listaIntervenciones.add(intervencion);
                pacienteTieneProcesoAsistencialAsociado = true;
            }else{
                ingreso = IngresosDAO.getIngreso(atiende.getProcesoasistencial());
                if (ingreso != null){
                    listaIngresos.add(ingreso);
                    pacienteTieneProcesoAsistencialAsociado = true;
                }else{
                    consulta = ConsultasDAO.getConsulta(atiende.getProcesoasistencial());
                    if (consulta != null){
                        listaConsultas.add(consulta);
                        pacienteTieneProcesoAsistencialAsociado = true;
                    }else{
                        urgencia = UrgenciasDAO.getUrgencia(atiende.getProcesoasistencial());
                        if (urgencia != null){
                            listaUrgencias.add(urgencia);
                            pacienteTieneProcesoAsistencialAsociado = true;
                        } 
                    }
                }
            }
        }
    }
    
    
    private void updateTableModels(){
        //ACTUALIZAMOS LAS LISTAS DE LOS TABLE MODELS
        tableModel_Intervenciones.setListaIntervenciones(listaIntervenciones);
        tableModel_Ingresos.setListaIngresos(listaIngresos);
        tableModel_Consultas.setListaConsultas(listaConsultas);
        tableModel_Urgencias.setListaUrgencias(listaUrgencias);
        
        //ACTUALIZAMOS EL CONTENIDO DE LOS JTABLES
        tableModel_Intervenciones.fireTableDataChanged();
        tableModel_Ingresos.fireTableDataChanged();
        tableModel_Consultas.fireTableDataChanged();
        tableModel_Urgencias.fireTableDataChanged();
    }

    public List<Intervenciones> getListaIntervenciones() {
        return listaIntervenciones;
    }

    public List<Ingresos> getListaIngresos() {
        return listaIngresos;
    }

    public List<Consultas> getListaConsultas() {
        return listaConsultas;
    }

    public List<Urgencias> getListaUrgencias() {
        return listaUrgencias;
    }
    
    
    
    
    public boolean exportarExcel(String path) {
        boolean seHaExportadoConExito;
        
        try{
            fxls = new FileHellper_xls_HistoriaClinica(this);
            fxls.exportar(path);
            seHaExportadoConExito = true;
        }catch (Exception ex){
            seHaExportadoConExito = false;
        }
        
        return seHaExportadoConExito;
        
    }
    
    
    
}
